﻿#include "MaxestMultiOfSubArr.h"

#ifdef DEV_TEST
#include <gtest/gtest.h>
class MaxestMultiOfSubArrTestCase
{
public:
	std::string arr;

	friend std::ostream& operator<<(std::ostream& os, const MaxestMultiOfSubArrTestCase& obj)
	{
		return os << "arr: " << obj.arr;
	}
};

class MaxestMultiOfSubArrTest :public SolutionTestor<IMaxestMultiOfSubArr, testing::TestWithParam<MaxestMultiOfSubArrTestCase>>
{
protected:
	void LoadSolutions(std::vector<IMaxestMultiOfSubArr*>& solutions) override
	{
		solutions = {
			new MaxestMultiOfSubArr::DP,
		};
	}
};

TEST_P(MaxestMultiOfSubArrTest, maxestMultiOfSubArr)
{
	TestForSolutions([](IMaxestMultiOfSubArr* solution)
		{
			auto testCase = GetParam();
			std::vector<int> arr;
			FormatedUtil::parseFormated(arr, testCase.arr);

			int expectMaxestMulti = INT_MIN;
			const int arrSize = arr.size();
			for (int i = 0; i < arrSize; ++i)
				for (int j = i; j < arrSize; ++j)
				{
					int multi = 1;
					for (int k = i; k <= j; ++k)
						multi *= arr[k];

					expectMaxestMulti = std::max<>(expectMaxestMulti, multi);
				}

			const auto result = solution->maxestMultiOfSubArr(arr);
			EXPECT_EQ(result, expectMaxestMulti);
		});
}

INSTANTIATE_TEST_SUITE_P(ValidityTestCases, MaxestMultiOfSubArrTest, testing::Values(
	MaxestMultiOfSubArrTestCase{ "[3,2,-2,4]" },
	MaxestMultiOfSubArrTestCase{ "[-3,0,-2]" },
	MaxestMultiOfSubArrTestCase{ "[-3,2,-2]" },
	MaxestMultiOfSubArrTestCase{ "[-1,-1,-1,-1,0,-1,-1,0,-1]" },
	MaxestMultiOfSubArrTestCase{ "[4,2,-1,2,9,0,-3,5,-1,9,8,7,-7,-2]" },
	MaxestMultiOfSubArrTestCase{ "[-1]" }
));
#endif